<?php
/**
 * V7 checked 1
 * 
 * @author Leon
 */
class data_recommend_at_home extends data {
	public function __construct() {
		parent::__construct();
		
	}
	/**
	 * 当从?ureadmer=123的推荐网址进入的时候，r为推荐的article_id。
	 *	if (该article id是推荐给我的) {
	 *		返回recommend id
	 *		检查我的member圈子太少，就自动加入
	 *	} else {
	 *		if (在我的阅读圈内) {
	 *			返回circle_article_id
	 *		} elseif (不在我的阅读圈内，但是有public圈子，可以阅读) {
	 *			返回circle_article_id
	 *			检查我的follower圈子太少，就自动follow
	 *		} else {
	 *			返回false，没有阅读权限
	 *		}
	 *	}
	 * @param type $uid
	 * @param type $article_id
	 * @return array (
	 *	open_type				// "recommend"		/ "circle"
	 *	id					// "recommend_id"	/ "circle_article_id"
	 * )
	 */
	public function check_recommend_by_article_id_if_auto_joinorfollow ($uid, $article_id) {
		$uid		= intval($uid);
		$article_id	= intval($article_id);
		
		if ($uid and $article_id) {
			$recommend_id = $this->is_to_me($uid, $article_id);
			if ($recommend_id) {
				// 是推荐给我的，返回recommen_id即可
				$return['open_type']	= 'recommend';
				$return['id']		= $recommend_id;
				
				// 查询我的圈子总数，如果太少，就自动添加
				$circle_total_by_me = $this->circle_total_by_me($uid, 'member');
				if ($circle_total_by_me <2) {						// 圈子太少，系统将尝试其添加为成员
					// 获取该文章所属的圈子（多个，顺便获得作者的id）
					$circle_array = $this->db->execute('
						select
							circle_id,
							author_id
						from
							circle_article
						where
							circle_article.article_id	= "'.$article_id.'"
					');
					if (is_array($circle_array)) {
						$author_id = $circle_array[0]['author_id'];			// 记录作者的id
						foreach ($circle_array as $v) {					// 把多个circle id连接成字符串
							$circle_str .= $v['circle_id'].',';
						}
						$circle_str = substr($circle_str, 0, -1);
						// 检查我是否是圈子成员
						$is_member = $this->db->execute('
							select
								id
							from
								circle_member
							where
								user_id	= "'.$uid.'"			and
								circle_id	IN ('.$circle_str.')		and
								(type = "member" or type = "admin" or type = "founder")
						');
						if (!$is_member) {
							// 我不是圈子成员，那么在上述圈子中获取级别最高的一个圈子，允许是private的（排序规则：作者在圈子中的地位更高，作者在圈子中发布的文章数更多）
							$circle_to_join = $this->db->execute('
								select
									circle_id
								from
									circle_member
								where
									user_id	= "'.$author_id.'"		and
									circle_id	IN ('.$circle_str.')		and
									(type = "member" or type = "admin" or type = "founder")
								order by
									type				DESC,
									total_articles_by_me	DESC
								limit
									1
							');
							if ($circle_to_join) {			// 加入圈子，不用检查邀请者了
								$this->join_circle($uid, $circle_to_join[0]['circle_id']);
							}
						}
					}
				}
				
				return $return ;
			} else {
				// 不是推荐给我的，检查是否有circle的阅读权限
				$is_access = $this->is_access($uid, $article_id);
				if ($is_access['is_in_my_circle'] and $is_access['circle_article_id']) {		// 在我的圈子里，可以阅读
					$return['open_type']	= 'circle';
					$return['id']		= $is_access['circle_article_id'];
					return $return;
				} elseif ($is_access['is_in_my_circle'] == false and $is_access['circle_article_id'] and $is_access['public_circle_id']) {	// 不在我的圈子里，但是圈子是公开的，可以阅读
					$return['open_type']	= 'circle';
					$return['id']		= $is_access['circle_article_id'];
					// 检查我follow的圈子数，如果太少，则自动follow它
					$circle_total_by_me = $this->circle_total_by_me($uid, 'follower');
					if ($circle_total_by_me < 2) {
						$this->follow_circle($uid, $is_access['public_circle_id']);		// follow这个圈子
					}
					return $return ;
				} else {											// 不在我的圈子里，而且圈子也不公开，没有阅读权限
					return false;			// 没有阅读权限
				}
			}
		} else return false;
	}
	private function is_to_me  ($uid, $article_id) {
		$execute = $this->db->execute('
			select
				*
			from
				recommend_article
			where
				recommend_article.receiver_id	= "'.$uid.'"		and
				recommend_article.article_id		= "'.$article_id.'"
			limit
				1
		');
		if ($execute['0']['id']) {
			return $execute['0']['id'];
		} else return false;
	}
	private function circle_total_by_me ($uid, $type) {
		$type = ($type == 'member' or $type == 'follower') ? $type : false;
		
		if ($type) {
			$execute = $this->db->execute('
				select
					COUNT(*)	AS total
				from
					circle_member
				where
					user_id	= "'.$uid.'"		and
					'.(($type == 'follower') ? ' type = "follower" ' : ' (type = "member" or type = "admin" or type = "founder") ').'
			');
			if ($execute) {
				return $execute[0]['total'];
			} else return false;
		} else return false;
	}
	private function is_access ($uid, $article_id) {
		$in_my_circle = $this->db->execute('
			select
				circle_article.id
			from
				circle_article, circle_member
			where
				circle_member.user_id	= "'.$uid.'"		and
				circle_article.article_id	= "'.$article_id.'"	and
				circle_article.circle_id	= circle_member.circle_id
			order by
				circle_member.type DESC
			limit
				1
		');
		if ($in_my_circle) {				// 在我的圈子里； 
			return array (
				'is_in_my_circle'	=> true,
				'circle_article_id'	=> $in_my_circle[0]['id']
			);
		} else {
			$public_circle = $this->db->execute('
				select
					circle_article.id,
					circle_article.circle_id
				from
					circle_article, circle
				where
					circle_article.article_id	= "'.$article_id.'"			and
					circle.id			= circle_article.circle_id		and
					circle.privacy		= "public"
				order by
					circle.total_article DESC
				limit
					1
			');
			if ($public_circle) {			// 不在我的圈子里，但是在公开圈子中，可以阅读
				return array (
					'is_in_my_circle'	=> false,
					'circle_article_id'	=> $public_circle[0]['id'],
					'public_circle_id'	=> $public_circle[0]['circle_id']
				);
			} else {					// 不在我的圈子里，也没有公开圈子，不能阅读
				return array (
					'is_in_my_circle'	=> false,
					'circle_article_id'	=> 0,
					'public_circle_id'	=> 0
				);
			}
		}
	}
	private function join_circle ($uid, $circle_id) {
		$data_circle = new data_circle();
		$data_circle->add_member(0, $uid, $circle_id, true);		// 不检查邀请者了
	}
	private function follow_circle ($uid, $circle_id) {
		$data_circle = new data_circle();
		$data_circle->add_follower($uid, $circle_id);
	}
}
?>
